//引入网络请求库
 import axios from 'axios'
//引入服务器地址
import baseURLs from './host.js'
import { Message } from 'element-ui';
import {getToken,removeToken} from '@/utils/auth'
import router from '@/router/index'
//创建axios实例
const instance = axios.create({
  baseURL:baseURLs,//当对象中的key与value一样是，可以简化
  timeout: 5000,//请求服务器超时时间

});

const ok = "10000";


//请求处理，添加请求头
instance.interceptors.request.use(

  config => {

    if (getToken()) {
      config.headers['Token'] = `${getToken()}` // 让每个请求携带token-- ['X-Token']为自定义key 请根据实际情况自行修改
    }

    return config
  },


  error => {
    // 发送失败
    Message.error("对不起，出错了")
    console.log(error) // for debug
    Promise.reject(error)
  }
)


// 对响应结果处理
instance.interceptors.response.use(
  response => {  //响应成功
    const res = response.data
    const errCode = res.code
    if (errCode !== undefined) {    //判断响应体内部的响应码
      // debugger
      // 50008:非法的token; 50012:其他客户端登录了;  50014:Token 过期了;
      if (errCode === 10002) {
        Message({
          message: res.message,
          type: 'error',
          duration: 1500
        })
        // this.$router.push("/login")
        removeToken();
        window.location.href = '/#/login';
        // router.push('/login');
        // store.dispatch('FedLogOut').then(() => {
        //   location.reload() // 为了重新实例化vue-router对象 避免bug
        // })


        return Promise.reject(new Error('token expired'))
      }else if(errCode == 10005){  //无数据
        Message({
          message: res.message,
          type: 'warning',
          duration: 1500
        });
      }else if (errCode != ok) {  //其他形式非响应成功状态码！=10000
        Message({
          message: res.message,
          type: 'error',
          duration: 1500
        })
      }
      return response;
    } else {
      return response
    }
  },
  error => {
    // 表示请求接受失败
    Message({
      message: error.message,
      type: 'error',
      duration: 1500
    })

    return Promise.reject(error)
  }
)

/**
 * 创建请求
 * @param {String} url 请求的路径，从根路径，形如 /user/list
 * @param {String} method 请求类型 形如 get,post,delete,put
 * @param {Object} data 请求时需要携带的数据
 * @returns
 */
export const createAPI = (url, method, data) => {
  let config = {}
  if (method === 'get') {
    config.params = data
  } else {
    config.data = data
  }
  return instance({
    url,
    method,
    ...config
  })
}
export const createParamsAPI = (url, method, data) => {
  let config = {}
  // config.params = data
  url += "?"+filterParams(data);
  // console.info(filter(data));
  // console.info(config.params);
  return instance({
    url,
    method,

    ...config
  })
}
function filterParams(params) {
  //console.info(params);
  let result = [];
  for (let field in params) {
    if (params[field] === undefined || params[field] === null) {
      result.push(`${field}=`);
      continue
    }
    if (Array.isArray(params[field])) {
      result.push(params[field].map(_ => `${field}=${_}`).join("&"));
    } else {
      result.push(`${field}=${encodeURIComponent(params[field])}`);
    }
  }
  return result.join("&");
}
export const createUploadAPI = (url, method, data) => {
  let config = {}
  config.data = data
  config.headers = {
    'Cache-Control': 'no-cache',
    'Content-Type': 'multipart/form-data'
  }
  return instance({
    url,
    method,
    ...config
  })
}

export const createFormAPI = (url, method, data) => {
  let config = {}
  config.data = data
  config.headers = {
    'Cache-Control': 'no-cache',
    'Content-Type': 'application/x-www-form-urlencoded'
  }
  config.responseType = 'json'
  config.transformRequest = [
    function(data) {
      let ret = ''
      for (let it in data) {
        ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
      }
      return ret
    }
  ]
  return instance({
    url,
    method,
    ...config
  })
}
export const createImgAPI = (url, method, data) => {
  let config = {}
  config.data = data
  config.headers = {
    'Cache-Control': 'no-cache',
    'Content-Type': 'application/x-www-form-urlencoded'
  }
  config.responseType = 'blob'
  config.transformRequest = [
    function(data) {
      let ret = ''
      for (let it in data) {
        ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
      }
      return ret
    }
  ]
  return instance({
    url,
    method,
    ...config
  })
}
// 组织架构导出
export const createFileAPI = (url, method, data) => {
  let config = {}
  config.data = data
  config.headers = {
    'Cache-Control': 'no-cache',
    'Content-Type': 'application/x-www-form-urlencoded'
  }
  config.responseType = 'blob'
  // config.responseType = 'arraybuffer'
  // config.transformRequest = [
  //   function(data) {
  //     let ret = ''
  //     for (let it in data) {
  //       ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
  //     }
  //     return ret
  //   }
  // ]
  return instance({
    url,
    method,
    ...config
  })
}
export const createLookFileAPI = (url, method, data) => {
  let config = {}
    config.params = data
    // config.data = data
  config.responseType = 'blob'
  // config.headers = {
  //   'Cache-Control': 'no-cache',
  //   'Content-Type': 'blob'
  // }
  return instance({
    url,
    method,
    ...config
  })
}


// // 添加响应拦截器
// instance.interceptors.response.use(function (response) {
//     // 2xx 范围内的状态码都会触发该函数。
//     // 对响应数据做点什么
//     //判断http状态码
//     if(response.status==200){
//         //将接口返回的数据包装成Promise对象返回
//         return Promise.resolve(response.data);
//     }
//     return null;
//   }, function (error) {
//     // 超出 2xx 范围的状态码都会触发该函数。
//     // 对响应错误做点什么
//     let res=error.response.data;
//     if(res.status==500){
//         showError("服务器出错");
//     }else{
//        showError(res.error);
//     }

//     return Promise.resolve({code:0,msg:res.error});
//   });


//错误消息提示
function showError(msg){
    Message({
        message:msg,
        type:"error"
    });
}

export const  get = (url,params)=>{
  return instance.get(url,{
      params
  });
}


    /**
     * 处理post请求
     * @param {Object} url  接口的相对地址
     * @param {Object} data  传递的对象数据  form-data形式传递
     * @return   以Promise对象形式返回接口返回的数据
     */
export const post=(url,data) => {
    return instance.post(url,data);
}

